perm filename XXRUN.SAI[X,ALS] blob sn#086475 filedate 1974-02-07 generic text, type T, neo UTF8
00010	BEGIN "XRUN"
00020	DEFINE ⊂="COMMENT";
00030	
00040	⊂ This program runs another program, BXX, as a separate job and produces
00050	an XGP plot of formant data from the specified file. This program may
00060	be executed directly, in which case it requests info from the TTY, or it
00070	be called into being as a separate job and passed a number specifying
00080	the file to be used. In this second case this program automatically
00090	kills its job on completion;
00100	
00110	DEFINE ⊃="⊂";
00120	DEFINE CR="'15",LF="'12",CRLF="CR&LF",TB="'11";
00130	  INTEGER I,J,K,L,M,X,Y,LX,LY,DX,DY,CHAN5,CHAN1,EOF,BRCHR,
00140	    PP,POINTP,FLAG,MUTE,NUM;
00150	  STRING FILEP,FILEN,READ,MEMO; BOOLEAN ER;
00160	  INTEGER ARRAY SAVE,JHSAVE[0:6];
00170	  INTEGER ARRAY LFILE[0:127];
00180	  INTEGER ARRAY NEW[0:511];
00190	  INTEGER ARRAY DPYBUF[0:4096];
00200	INTEGER A1,A2,A3;
00210	LABEL STARTP;
00220	INTEGER DATE,TIME;
00230	DEFINE GETIME="BEGIN DATE←CALL(0,""DATE""); TIME←CALL(0,""TIMER"")%60; END;";
00240	PRELOAD_WITH "JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG",
00250		"SEP","OCT","NOV","DEC";
00260	STRING ARRAY MONTHS[0:11];
00270	
00280	INTERNAL STRING PROCEDURE DATIM;
00290	BEGIN
00300	INTEGER DAY,YR,HRS,MIN,SEC;
00310	DAY←(DATE MOD 31)+1;DATE←DATE%31;
00320	YR←1964+DATE%12; SEC←TIME MOD 60;
00330	TIME←TIME%60; MIN←TIME MOD 60; HRS←TIME%60;
00340	SETFORMAT(-2,0);
00350	RETURN(CVS(DAY)&"-"&MONTHS[DATE MOD 12]&
00360	   "-"&CVS(YR)&"   "&CVS(HRS)&CVS(MIN)&":"&CVS(SEC));
00370	END;
00380	
00390	INTERNAL STRING PROCEDURE WTIM;
00400	BEGIN
00410	DATE←SAVE[2] LAND '7777; TIME←LDB(POINT(11,SAVE[2],23))*60;
00420	RETURN(DATIM);
00430	END;
00440	
00450	INTERNAL STRING PROCEDURE DATIME;
00460	BEGIN
00470	GETIME;
00480	RETURN(DATIM);
00490	END;
00500	
00510	
00520	⊂ Allow 1140 units on a line corresponding to 76 charactters @15 units,
00530	   380 segments @ 3 and 48640 samples @ 3/128 unit, or 2.432 seconds;
00540	
00550	
00560	PROCEDURE XPLOT;
00570	BEGIN "XPLOT"
00580	REQUIRE "SXF.REL[SAI,NJM]" LIBRARY;
00590	REQUIRE "XM.REL[PIT,NJM]" LIBRARY;
00600	REQUIRE "SIO.REL[SAI,NJM]" LIBRARY;
00610	EXTERNAL FORTRAN PROCEDURE XSET;
00620	EXTERNAL FORTRAN PROCEDURE XRVEC;
00630	EXTERNAL FORTRAN PROCEDURE XVEC;
00640	EXTERNAL FORTRAN PROCEDURE XIVEC;
00650	EXTERNAL FORTRAN PROCEDURE XIRVEC;
00660	EXTERNAL FORTRAN PROCEDURE XLINE;
00670	EXTERNAL FORTRAN PROCEDURE VERTAX;
00680	EXTERNAL FORTRAN PROCEDURE SWT25;
00690	EXTERNAL FORTRAN PROCEDURE PTX1;
00700	EXTERNAL FORTRAN PROCEDURE XOUT;
00710	EXTERNAL FORTRAN PROCEDURE XFIN;
00720	INTERNAL STRING XSTR,XSTR1,XSTR2,XSTRH;
00730	INTEGER IX,IX2,IY,XREF,YREF,X2,Y2,HT,XSAVE,XCUT;
00740	INTEGER MIN,MAX,ERR;
00750	MIN←0;
00760	MAX←3500;
00770	XREF←400;
00780	YREF←400;
00790	HT←700;	⊂ Allowing 5 inches for 5000 hertz;
00800	XSET;
00801	
00805	IX←XREF-90; IY←YREF+740; XSTR←"Hertz"; SWT25(IX,IY);
00810	VERTAX(MIN,MAX,XREF,YREF,HT);
00830	IX←XREF-150;
00840	XSTR←"    Null"; IY←YREF-225; SWT25(IX,IY);
00850	XSTR←" Silence"; IY←YREF-225+30; SWT25(IX,IY);
00860	XSTR←"Fricativ"; IY←YREF-225+60; SWT25(IX,IY);
00870	XSTR←"Voi.Fri."; IY←YREF-225+90; SWT25(IX,IY);
00880	XSTR←"Nas.Vow."; IY←YREF-225+120; SWT25(IX,IY);
00890	XSTR←"  Voiced"; IY←YREF-225+150; SWT25(IX,IY);
00900	
00910	XOUT(XREF-8);
00920	XSAVE←0;
00930	
00940	CLOSE(CHAN5); OPEN(CHAN5,"DSK",'10,2,0,0,0,EOF);
00950	LOOKUP(CHAN5,FILEP,ERR);
00960	FILEINFO(SAVE);
00970	IF ERR THEN OUTSTR("FILE "&FILEP&"  NOT FOUND"&CRLF);
00980	ARRYIN(CHAN5,LFILE[0],'200);
00990	
01000	XSTR←""; FOR I←10 STEP 1 UNTIL 20 DO XSTR←XSTR&CVXSTR(LFILE[I]);
01010	IX←XREF; IY←YREF-300; SWT25(IX,IY);
01020	 READ←WTIM; SETFORMAT(1,0);
01030	
01040	XSTR←"The first "&CVS(NUM)&" formants in parameter file "
01050	     &FILEP&" (created "&READ&")";
01060	IX←XREF; IY← YREF+900; SWT25(IX,IY);
01070	XSTR←"Mute level at "&CVS(MUTE)&". "&MEMO;
01080	IX←XREF+100; IY←YREF+870; SWT25(IX,IY);
01090	XSTR←"A.I. Laboratory, Stanford University.   "&DATIME;
01100	IX←XREF+200; IY←YREF+840; SWT25(IX,IY);
01110	
01120	FOR I←21 STEP 1 UNTIL 127 DO BEGIN "PONY"
01130	  IF LFILE[I]=0 THEN DONE;
01140	  L←LFILE[I] LAND '777760000000;
01150	  J←LDB(POINT(14,LFILE[I],27))-1; K←LDB(POINT(8,LFILE[I],35))-1;
01160	
01170	  X←J*4+K*2-8; ⊂ X←(J+K%2)*128%32-8;
01180	  IF X<XSAVE+16 THEN X←XSAVE+16; XSAVE←X;
01190	  IX←XREF+X; IY←YREF-45; XSTR←(READ←CVSTR(L))[1 TO 1]; SWT25(IX,IY);
01200	  IF (XSTR←READ[2 TO 2])≠"" THEN BEGIN
01210	    IY←YREF-70; SWT25(IX,IY); END;
01220	
01230	  IX←XREF+J*4; IX2←IX+K*4;
01240	  XLINE(IX,YREF-20,IX,YREF);
01250	  XLINE(IX,YREF,IX2,YREF);
01260	  XLINE(IX,YREF-1,IX2,YREF-1);
01270	  XLINE(IX,YREF-2,IX2,YREF-2);
01280	  XLINE(IX2,YREF,IX2, YREF-20);
01290	
01300	  END "PONY";
01310	OUTSTR("Text,");
01320	FOR I←0 STEP 625 UNTIL IX DO BEGIN "TIME"
01330	  XLINE(XREF+I,YREF,XREF+I,YREF+20);
01340	  FOR K←1 STEP 1 UNTIL 9 DO BEGIN
01350	    IX←XREF+I+K*625%10; IF IX>IX2 THEN DONE "TIME";
01360	    XLINE(IX,YREF,IX,YREF+10); END;
01370	  END "TIME";
01380	
01390	XCUT←IX2+200;
01400	
01410	
01420	FOR I←0 STEP 1 UNTIL 5 DO SAVE[I]←0; JHSAVE[0]←JHSAVE[1]←0;
01430	WHILE EOF=0 DO BEGIN "XDATIN"
01440	  ARRYIN(CHAN5,NEW[0],512);
01445	    IF NEW[0]=0 THEN DONE;
01450	
01460	  FOR I←1 STEP 1 UNTIL NUM DO BEGIN "XPLO"
01470	    LY←SAVE[I]; LX←SAVE[0]; XIVEC(XREF+LX,YREF+LY);
01480	    FOR J←0 STEP 8 UNTIL 504 DO BEGIN
01490	      IF NEW[J]=0 THEN DONE;
01500	      X←(NEW[J] LSH -15)%32;
01510	        ⊂ Allowing 32 samples per unit or 3.125 inches per second;
01520	        ⊂ This corresponds to 512 samples (32*16) per character;
01530	
01540	      POINTP←POINT(9,NEW[J+1],-1);
01550	      FOR K←1 STEP 1 UNTIL I DO IBP(POINTP);
01560	      Y← LDB(POINTP)*2000%256; ⊂ 5 inches for 5000 hertz;
01570	
01580	      IF Y=0 THEN Y←LY;
01590	      DX←X-LX; LX←X; DY←Y-LY; LY←Y;
01600	      IF (LDB(POINT(9,NEW[J+2],17)) < MUTE)∨(DX<3)
01610	        THEN XIRVEC(DX,DY) ELSE  XRVEC(DX,DY);
01620	      END;
01630	    SAVE[I]←LY;
01640	    END "XPLO";
01650	    LX←JHSAVE[0]; LY←JHSAVE[1];XIVEC(XREF+LX,YREF-212+LY);
01660	
01670	
01680	    FOR J←0 STEP 8 UNTIL 504 DO BEGIN
01700	      X←(NEW[J] LSH -15)%32;
01710	      IF NEW[J]=0 THEN DONE;
01730	
01740	      Y← LDB(POINT(9,NEW[J+7],35))*30;
01750	      DX←X-LX; LX←X; DY←Y-LY; LY←Y;
01760	      XRVEC(DX,DY);
01770	      END;
01780	    JHSAVE[0]←LX; JHSAVE[1]←LY;
01790	  XOUT(LX-2); OUTSTR(CVS(LX)&",");
01800	
01810	  IF X=0 THEN DONE "XDATIN";
01820	  SAVE[0]←LX;
01830	  END "XDATIN";
01840	CLOSE(CHAN5);
01850	XOUT(XCUT); OUTSTR(CVS(XCUT)&CRLF);
01860	IF XCUT<2200 THEN BEGIN XCUT←2200; XOUT(XCUT); END;
01870	
01880	XFIN;
01890	END "XPLOT";
01900	
     

00010	CHAN1←1; CHAN5←5;
00020	STDBRK(1);
00030	STARTP:
00040	MUTE←60; NUM←3;
00050	CLOSE(CHAN1); OPEN(CHAN1,"DSK",0,1,0,70,BRCHR,EOF);
00060	LOOKUP(CHAN1,"NUMBER.TMP",ER);
00070	IF ER THEN BEGIN
00080	OUTSTR("The following set-up commands of a letter followed by a number "
00090	  &"may be given:"&CRLF);
00100	OUTSTR("	M#	sets MUTE level (default value 60)"&CRLF&
00110	       "	N#	sets number of formants (default value 3)."&CRLF);
00120	OUTSTR("A number only uses preset values for M and N and specifies the file to use."
00130	      &CRLF&TB&"A CR only calls for file # 1."&CRLF&LF);
00140	SETFORMAT(1,0); FLAG←0; X←0;
00150	WHILE TRUE DO BEGIN "TYPE" OUTSTR("Type command  "); READ←INCHWL;
00160	IF READ[1 TO 1]="M" THEN BEGIN MUTE←CVD(READ[2 TO 4]);CONTINUE "TYPE";END;
00170	IF READ[1 TO 1]="N" THEN BEGIN NUM←CVD(READ[2 TO 2]);CONTINUE "TYPE";END;
00180	DONE; END "TYPE";
00190	IF READ="" THEN PP←1 ELSE PP←CVD(READ);
00200	END ELSE BEGIN
00210	  PP←CVD(INPUT(CHAN1,1));
00220	  CLOSE(CHAN1);
00230	  END;
00240	
00250	FILEP←"SEG"&CVS(PP)&".SYN[2,JH]";
00260	
00270	XPLOT;
00280	IF ER THEN PTOSTR(0,"RU BXX[PIT,NJM]"&CRLF) ELSE
00290	PTOSTR(0,"RU BXX[PIT,NJM]"&CRLF&"K"&CRLF);
00300	
00310	END "XRUN";